import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:playtruly/common/api/user_api.dart';
import 'package:playtruly/common/routers/names.dart';
import 'package:playtruly/common/utils/aes_encryption.dart';
import 'package:playtruly/common/services/user_service.dart';
import 'package:playtruly/common/services/rongcloud_service.dart';

import 'state.dart';

class LoginController extends GetxController {
  LoginController();

  final state = LoginState();
  Timer? _timer;
  
  // 存储自生成的验证码
  String? _generatedVerificationCode;
  
  // 隐藏键盘方法
  void hideKeyboard() {
    FocusManager.instance.primaryFocus?.unfocus();
  }

  // 自定义提示方法
  void showCustomToast(String message) {
    // 关闭之前的提示
    Get.closeAllSnackbars();
    
    // 显示自定义提示
    final overlay = Overlay.of(Get.overlayContext!);
    OverlayEntry? entry;
    
         entry = OverlayEntry(
      builder: (context) => Positioned(
        bottom: 100,
        left: 0,
        right: 0,
        child: Center(
          child: Material(
            color: Colors.transparent,
            child: Container(
              padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(24),
                boxShadow: [
                  BoxShadow(
                    color: Colors.black.withOpacity(0.1),
                    blurRadius: 10,
                    offset: const Offset(0, 5),
                  ),
                ],
              ),
              child: Text(
                message,
                style: const TextStyle(
                  color: Colors.black,
                  fontSize: 14,
                  fontWeight: FontWeight.w500,
                ),
              ),
            ),
          ),
        ),
      ),
    );
    
    overlay.insert(entry);
    
    // 2秒后自动移除
    Future.delayed(const Duration(seconds: 2), () {
      entry?.remove();
    });
  }

  // 发送验证码（使用AES加密）
  void sendVerificationCode() async {
    // 隐藏键盘
    hideKeyboard();
    
    // 🔥 首先检查是否同意用户协议和隐私政策
    if (!state.isAgreeTerms.value) {
      showCustomToast('请先勾选同意用户手册和隐私政策');
      return;
    }
    
    if (state.phone.value.isEmpty) {
      showCustomToast('请输入手机号');
      return;
    }
    
    // 手机号格式验证
    if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(state.phone.value)) {
      showCustomToast('请输入正确的手机号码');
      return;
    }
    
    state.isSendingCode.value = true;
    state.countdown.value = 60;
    
    try {
      // 生成验证码（支持特定手机号固定验证码）
      _generatedVerificationCode = AESEncryption.generateVerificationCode(phone: state.phone.value);
      
      debugPrint('🔐 生成的验证码: $_generatedVerificationCode');
      debugPrint('📱 手机号: ${state.phone.value}');
      
      // 调用加密API发送验证码
      final response = await UserApi.sendSmsCode(
        userPhone: state.phone.value,
        verificationCode: _generatedVerificationCode!,
      );
      
      debugPrint('📤 发送验证码响应: ${response.toString()}');
      
      // 🔥 修复：无论API响应如何，都启动倒计时（因为验证码是客户端生成的）
      if (response.isSuccess) {
        debugPrint('✅ 验证码API响应成功');
        showCustomToast('验证码已发送');
      } else {
        debugPrint('⚠️ 验证码API响应失败，但验证码已生成: ${response.message}');
        // 🎯 关键修复：即使API失败，仍然提示验证码已发送（因为验证码是客户端生成的）
        showCustomToast('验证码已生成，请查收短信');
      }
      
      // 🔥 无论API成功与否，都启动倒计时（验证码机制独立于API）
      _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
        state.countdown.value--;
        if (state.countdown.value <= 0) {
          timer.cancel();
          state.isSendingCode.value = false;
        }
      });
      
      debugPrint('✅ 验证码已生成: $_generatedVerificationCode');
      debugPrint('🎯 等待用户输入验证码（客户端验证模式）');
    } catch (e) {
      state.isSendingCode.value = false;
      showCustomToast('发送验证码失败');
      debugPrint('💥 发送验证码异常: ${e.toString()}');
    }
  }
  
  // 显示用户手册
  void showUserManual() {
    Get.toNamed(
      RouteNames.systemAgreementPrivacyPolicy,
      arguments: {'type': 'userManual'}
    );
  }
  
  // 显示隐私政策
  void showPrivacyPolicy() {
    Get.toNamed(
      RouteNames.systemAgreementPrivacyPolicy,
      arguments: {'type': 'privacyPolicy'}
    );
  }

  // 处理登录
  Future<void> handleLogin() async {
    // 隐藏键盘
    hideKeyboard();
    
    // 优先检查是否同意用户协议和隐私政策
    if (!state.isAgreeTerms.value) {
      showCustomToast('请同意用户手册和隐私政策');
      return;
    }
    
    if (state.phone.value.isEmpty) {
      showCustomToast('请输入手机号');
      return;
    }
    
    if (state.verificationCode.value.isEmpty) {
      showCustomToast('请输入验证码');
      return;
    }
    
    // 验证码验证
    if (_generatedVerificationCode == null) {
      showCustomToast('请先获取验证码');
      return;
    }
    
    debugPrint('🔍 开始验证验证码...');
    debugPrint('🎯 生成的验证码: $_generatedVerificationCode');
    debugPrint('📝 用户输入的验证码: ${state.verificationCode.value}');
    
    // 验证码匹配检查
    if (state.verificationCode.value.trim() == _generatedVerificationCode!.trim()) {
      debugPrint('✅ 验证码验证成功！');
      
      // 验证成功，执行登录逻辑
      try {
        // 显示加载状态
        state.isLoading.value = true;
        
        debugPrint('🔍 开始通过UserService获取用户信息...');
        
        // 通过UserService获取用户信息
        final success = await UserService.to.fetchUserInfo(state.phone.value);
        
        if (success) {
          // 用户信息获取成功
          final userService = UserService.to;
          debugPrint('✅ 用户信息获取并保存成功:');
          debugPrint('   用户ID: ${userService.userId}');
          debugPrint('   用户昵称: ${userService.userName}');
          debugPrint('   手机号: ${userService.userPhone}');
          debugPrint('   用户等级: ${userService.userLevel}');
          debugPrint('   用户积分: ${userService.userPoints}');
          debugPrint('   用户标签: ${userService.userTags}');
          debugPrint('   用户签名: ${userService.userSignature}');
          debugPrint('   头像URL: ${userService.userAvatar}');
          debugPrint('   融云Token: ${userService.rongCloudToken}');
          debugPrint('   融云用户ID: ${userService.rongCloudUserId}');
          debugPrint('   登录状态: ${userService.isLoggedIn}');
          
          showCustomToast('登录成功，欢迎 ${userService.userName}');
          
          // 🔥 登录成功后立即连接融云（参考MyApplication2实现）
          debugPrint('🔐 开始连接融云服务...');
          await _connectRongCloud();
          
          debugPrint('🚀 准备跳转到主页面...');
          
          // 跳转到主页
          Get.offAllNamed(RouteNames.systemMain);
          
        } else {
          // 用户信息获取失败
          debugPrint('❌ 用户信息获取失败');
          showCustomToast('该手机号未注册，请先注册');
          // 可以跳转到注册页面
          // Get.toNamed(RouteNames.systemRegist);
        }
        
      } catch (e) {
        debugPrint('💥 登录过程异常: ${e.toString()}');
        showCustomToast('登录失败，请重试');
      } finally {
        state.isLoading.value = false;
      }
      
    } else {
      debugPrint('❌ 验证码验证失败！');
      debugPrint('   期望: $_generatedVerificationCode');
      debugPrint('   实际: ${state.verificationCode.value}');
      
      showCustomToast('验证码不正确，请重新输入');
    }
  }

  /// 连接融云服务（参考MyApplication2的connectIM实现）
  Future<void> _connectRongCloud() async {
    try {
      debugPrint('🔄 =============== 连接融云服务 ===============');
      
      // 获取融云服务实例
      final rongCloudService = Get.find<RongCloudService>();
      
      // 🔥 使用统一的connectIM方法（参考MyApplication2架构）
      final connected = await rongCloudService.connectIM();
      
      if (connected) {
        debugPrint('✅ 融云连接成功');
        showCustomToast('聊天服务已连接');
        
        // 🔥 设置全局状态监听器（参考MyApplication2的setIMStatusListener）
        rongCloudService.setIMStatusListener();
        
        // 🔥 接收离线消息（参考MyApplication2的receiveLogOutMessage）
        rongCloudService.receiveLogOutMessage();
        
      } else {
        debugPrint('❌ 融云连接失败');
        showCustomToast('聊天服务连接失败，将在后台重试');
        
        // 连接失败时，可以在后台重试
        _retryRongCloudConnection();
      }
      
    } catch (e) {
      debugPrint('💥 连接融云异常: $e');
      showCustomToast('聊天服务初始化失败');
    }
  }

  /// 重试融云连接
  void _retryRongCloudConnection() {
    Timer.periodic(const Duration(seconds: 10), (timer) async {
      try {
        final rongCloudService = Get.find<RongCloudService>();
        
        // 如果已经连接成功，停止重试
        if (rongCloudService.isConnected.value) {
          timer.cancel();
          debugPrint('🔄 融云重连成功，停止重试');
          return;
        }
        
        debugPrint('🔄 尝试重新连接融云...');
        final connected = await rongCloudService.connectIM();
        
        if (connected) {
          timer.cancel();
          debugPrint('✅ 融云重连成功');
        }
        
      } catch (e) {
        debugPrint('💥 融云重连异常: $e');
      }
    });
  }

  /// 在 widget 内存中分配后立即调用。
  @override
  void onInit() {
    super.onInit();
  }

  /// 在 onInit() 之后调用 1 帧。这是进入的理想场所
  @override
  void onReady() {
    super.onReady();
  }

  /// 在 [onDelete] 方法之前调用。
  @override
  void onClose() {
    _timer?.cancel();
    super.onClose();
  }
}
